home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / bin / hw-detect < prev    next >
Text File  |  2009-10-28  |  15KB  |  610 lines

  1. #!/bin/sh
  2.  
  3. set -e
  4. . /usr/share/debconf/confmodule
  5. #set -x
  6.  
  7. if [ -z "$1" ]; then
  8.     PROGRESSBAR=hw-detect/detect_progress_step
  9. else
  10.     PROGRESSBAR=$1
  11. fi
  12.  
  13. NEWLINE="
  14. "
  15. MISSING_MODULES_LIST=""
  16. SUBARCH="$(archdetect)"
  17.  
  18. finish_install=/usr/lib/finish-install.d/30hw-detect
  19.  
  20. LOAD_IDE=""
  21. if db_get hw-detect/load-ide && [ "$RET" = true ]; then
  22.     LOAD_IDE=1
  23. fi
  24.  
  25. # Check for virtio devices
  26. if [ -d /sys/bus/pci/devices ] && \
  27.     grep -q 0x1af4 /sys/bus/pci/devices/*/vendor 2>/dev/null && \
  28.     ! grep -q ^virtio_ /proc/modules; then
  29.     anna-install virtio-modules || true
  30. fi
  31.  
  32. if [ -x /sbin/depmod ]; then
  33.     depmod -a > /dev/null 2>&1 || true
  34. fi
  35.  
  36. log () {
  37.     logger -t hw-detect "$@"
  38. }
  39.  
  40. is_not_loaded() {
  41.     ! ((cut -d" " -f1 /proc/modules | grep -q "^$1\$") || \
  42.        (cut -d" " -f1 /proc/modules | sed -e 's/_/-/g' | grep -q "^$1\$"))
  43. }
  44.  
  45. is_available () {
  46.     [ "$(modprobe -l $1)" ] || return 1
  47. }
  48.  
  49. # Module as first parameter, description of device the second.
  50. missing_module () {
  51.     if ! in_list "$1" "$MISSING_MODULES_LIST"; then
  52.         if [ -n "$MISSING_MODULES_LIST" ]; then
  53.             MISSING_MODULES_LIST="$MISSING_MODULES_LIST, "
  54.         fi
  55.         MISSING_MODULES_LIST="$MISSING_MODULES_LIST$1 ($2)"
  56.     fi
  57. }
  58.  
  59. # The list can be delimited with spaces or spaces and commas.
  60. in_list() {
  61.     echo "$2" | grep -q "\(^\| \)$1\(,\| \|$\)"
  62. }
  63.  
  64. snapshot_devs() {
  65.     echo -n `grep : /proc/net/dev | cut -d':' -f1`
  66. }
  67.  
  68. compare_devs() {
  69.     local olddevs="$1"
  70.     local devs="$2"
  71.     local dev newdevs
  72.  
  73.     newdevs=
  74.     for dev in $devs; do
  75.         if ! echo " $olddevs " | grep -q " $dev "; then
  76.             newdevs="${newdevs:+$newdevs }$dev"
  77.         fi
  78.     done
  79.     echo "$newdevs"
  80. }
  81.  
  82. load_module() {
  83.     local module="$1"
  84.     local cardname="$2"
  85.     local devs=""
  86.     local olddevs=""
  87.     local newdev=""
  88.  
  89.     old=`cat /proc/sys/kernel/printk`
  90.     echo 0 > /proc/sys/kernel/printk
  91.  
  92.     devs="$(snapshot_devs)"
  93.     if log-output -t hw-detect modprobe -v "$module"; then
  94.         olddevs="$devs"
  95.         devs="$(snapshot_devs)"
  96.         newdevs="$(compare_devs "$olddevs" "$devs")"
  97.  
  98.         # Make sure space is used as a delimiter.
  99.         IFS_SAVE="$IFS"
  100.         IFS=" "
  101.         if [ -n "$newdevs" -a -n "$cardname" ]; then
  102.             mkdir -p /etc/network
  103.             for dev in $newdevs; do
  104.                 echo "${dev}:${cardname}" >> /etc/network/devnames
  105.             done
  106.         fi
  107.         IFS="$IFS_SAVE"
  108.     else   
  109.         log "Error loading '$module'"
  110.         if [ "$module" != floppy ] && [ "$module" != ide-floppy ] && \
  111.            [ "$module" != ide-cd ]; then
  112.             db_subst hw-detect/modprobe_error CMD_LINE_PARAM "modprobe -v $module"
  113.             db_input medium hw-detect/modprobe_error || [ $? -eq 30 ]
  114.             db_go
  115.         fi
  116.     fi
  117.  
  118.     echo $old > /proc/sys/kernel/printk
  119. }
  120.  
  121. # Some pci chipsets are needed or there can be DMA or other problems.
  122. get_ide_chipset_info() {
  123.     for ide_module in $(find /lib/modules/*/kernel/drivers/ide/pci/ -type f 2>/dev/null); do
  124.         if [ -e $ide_module ]; then
  125.             baseidemod=$(echo $ide_module | sed 's/\.ko$//; s/.*\///')
  126.             echo "$baseidemod:IDE chipset support"
  127.         fi
  128.     done
  129. }
  130.  
  131. # Return list of lines formatted "module:Description"
  132. get_detected_hw_info() {
  133.     if [ "${SUBARCH%%/*}" = powerpc ]; then
  134.         discover-mac-io
  135.         if [ "$SUBARCH" = powerpc/chrp_rs6k ] || \
  136.            [ "$SUBARCH" = powerpc/chrp_ibm ]; then
  137.             discover-ibm
  138.         fi
  139.     fi
  140.     if [ "${SUBARCH%%/*}" = sparc ]; then
  141.         discover-sbus
  142.     fi
  143.     if [ -d /proc/bus/usb ]; then
  144.         echo "usb-storage:USB storage"
  145.     fi
  146. }
  147.  
  148. # NewWorld PowerMacs don't want floppy or ide-floppy, and on some models
  149. # (e.g. G5s) the kernel hangs when loading the module.
  150. get_floppy_info() {
  151.     case $SUBARCH in
  152.         powerpc/powermac_newworld) ;;
  153.         *) echo "floppy:Linux Floppy" ;;
  154.     esac
  155. }
  156.  
  157. get_ide_floppy_info() {
  158.     case $SUBARCH in
  159.         powerpc/powermac_newworld) ;;
  160.         *) echo "ide-floppy:Linux IDE floppy" ;;
  161.     esac
  162. }
  163.  
  164. get_rtc_info() {
  165.     # On i386, this gets loaded by hotplug through isapnp, but that
  166.     # doesn't work on amd64.
  167.     case $SUBARCH in
  168.         amd64/*) register-module rtc ;;
  169.     esac
  170. }
  171.  
  172. # Manually load modules to enable things we can't detect.
  173. # XXX: This isn't the best way to do this; we should autodetect.
  174. # The order of these modules are important.
  175. get_manual_hw_info() {
  176.     if [ "$LOAD_IDE" ]; then
  177.         get_floppy_info
  178.         get_ide_chipset_info
  179.         echo "ide-generic:Linux IDE support"
  180.         get_ide_floppy_info
  181.         echo "ide-disk:Linux ATA DISK"
  182.         echo "ide-cd:Linux ATAPI CD-ROM"
  183.     fi
  184.     get_rtc_info
  185.  
  186.     case $SUBARCH in
  187.         powerpc/ps3)
  188.             echo "ps3rom:PS3 internal CD-ROM drive"
  189.             echo "ps3disk:PS3 internal disk drive"
  190.             echo "ps3_gelic:PS3 Gigabit Ethernet"
  191.             register-module snd_ps3
  192.         ;;
  193.     esac
  194. }
  195.  
  196. # Based on syslog from #486298
  197. megaraid_complete() {
  198.     dmesg | grep -Eq "megaraid mbox: (Wait for 0 commands to complete|reset sequence completed sucessfully)"
  199. }
  200. wait_megaraid_complete() {
  201.     local wait=300
  202.  
  203.     if megaraid_complete; then
  204.         return 0
  205.     fi
  206.  
  207.     sleep 10 # Early initialization phase
  208.     if dmesg | grep -q "megaraid mbox: Wait for [0-9]*[1-9] commands to complete"; then
  209.         log "Megaraid initialization: waiting for reset to complete"
  210.         while [ $wait -gt 0 ]; do
  211.             sleep 1
  212.             if megaraid_complete; then
  213.                 log "Megaraid initialization: reset complete"
  214.                 sleep 1
  215.                 break
  216.             fi
  217.             wait=$(($wait - 1))
  218.         done
  219.         if [ $wait -eq 0 ]; then
  220.             log "Megaraid initialization: failed to complete reset!"
  221.         fi
  222.     fi
  223. }
  224.  
  225. # Should be greater than the number of kernel modules we can reasonably
  226. # expect it will ever need to load.
  227. MAX_STEPS=1000
  228. OTHER_STEPS=5
  229. # Use 1/10th of the progress bar for the non-module-load steps.
  230. OTHER_STEPSIZE=$(expr $MAX_STEPS / 10 / $OTHER_STEPS)
  231. db_progress START 0 $MAX_STEPS $PROGRESSBAR
  232.  
  233. db_progress INFO hw-detect/detect_progress_step
  234.  
  235. # TODO: Can possibly be removed if udev will load yenta_socket automatically
  236. # Load yenta_socket, if hardware is available, for Cardbus cards.
  237. if [ -d /sys/bus/pci/devices ] && \
  238.     grep -q 0x060700 /sys/bus/pci/devices/*/class 2>/dev/null && \
  239.     ! grep -q ^yenta_socket /proc/modules; then
  240.     db_subst hw-detect/load_progress_step CARDNAME "Cardbus bridge"
  241.     db_subst hw-detect/load_progress_step MODULE "yenta_socket"
  242.     db_progress INFO hw-detect/load_progress_step
  243.     
  244.     log "Detected Cardbus bridge, loading yenta_socket"
  245.     load_module yenta_socket
  246.     # Ugly hack, but what's the alternative?
  247.     sleep 3 || true
  248. fi
  249.  
  250. # If using real hotplug, re-run the rc scripts to pick up new modules.
  251. # TODO: this just loads modules itself, rather than handing back a list
  252. # Since we've just run depmod, new modules might be available, so we
  253. # must trigger as well as settle.
  254. update-dev
  255.  
  256. ALL_HW_INFO=$(get_detected_hw_info; get_manual_hw_info)
  257. db_progress STEP $OTHER_STEPSIZE
  258.  
  259. # Remove modules that are already loaded or not available, and construct
  260. # the list for the question.
  261. LIST=""
  262. PROCESSED=""
  263. AVAIL_MODULES="$(find /lib/modules/$(uname -r)/ | sed 's!.*/!!' | cut -d . -f 1)"
  264. LOADED_MODULES="$(cut -d " " -f 1 /proc/modules) $(cut -d " " -f 1 /proc/modules | sed -e 's/_/-/g')"
  265. IFS_SAVE="$IFS"
  266. IFS="$NEWLINE"
  267. for device in $ALL_HW_INFO; do
  268.     module="${device%%:*}"
  269.     cardname="${device##*:}"
  270.     if [ "$module" != "ignore" -a "$module" != "" ] &&
  271.        ! in_list "$module" "$LOADED_MODULES" &&
  272.        ! in_list "$module" "$PROCESSED"
  273.     then
  274.         if [ -z "$cardname" ]; then
  275.             cardname="[Unknown]"
  276.         fi
  277.         
  278.         if in_list "$module" "$AVAIL_MODULES"; then
  279.             LIST="${LIST:+$LIST, }$module ($(echo "$cardname" | sed 's/,/ /g'))"
  280.             PROCESSED="$PROCESSED $module"
  281.         else
  282.             missing_module "$module" "$cardname"
  283.         fi
  284.     fi
  285. done
  286. IFS="$IFS_SAVE"
  287. db_progress STEP $OTHER_STEPSIZE
  288.  
  289. if [ "$LIST" ]; then
  290.     # Ask which modules to install.
  291.     db_subst hw-detect/select_modules list "$LIST"
  292.     db_set hw-detect/select_modules "$LIST"
  293.     db_input medium hw-detect/select_modules || true
  294.     db_go || exit 10 # back up
  295.     db_get hw-detect/select_modules
  296.     LIST="$RET"
  297. fi
  298.  
  299. list_to_lines() {
  300.     echo "$LIST" | sed 's/, /\n/g'
  301. }
  302.  
  303. # Work out amount to step per module load. expr rounds down, so 
  304. # it may not get quite to 100%, but will at least never exceed it.
  305. MODULE_STEPS=$(expr \( $MAX_STEPS - \( $OTHER_STEPS \* $OTHER_STEPSIZE \) \))
  306. if [ "$LIST" ]; then
  307.     MODULE_STEPSIZE=$(expr $MODULE_STEPS / $(list_to_lines | wc -l))
  308. fi
  309.  
  310. IFS="$NEWLINE"
  311.  
  312. for device in $(list_to_lines); do
  313.     module="${device%% *}"
  314.     cardname="`echo $device | cut -d'(' -f2 | sed 's/)$//'`"
  315.     # Restore IFS after extracting the fields.
  316.     IFS="$IFS_SAVE"
  317.  
  318.     if [ -z "$module" ] ; then module="[Unknown]" ; fi
  319.     if [ -z "$cardname" ] ; then cardname="[Unknown]" ; fi
  320.  
  321.     log "Detected module '$module' for '$cardname'"
  322.  
  323.     if is_not_loaded "$module"; then
  324.         db_subst hw-detect/load_progress_step CARDNAME "$cardname"
  325.         db_subst hw-detect/load_progress_step MODULE "$module"
  326.         db_progress INFO hw-detect/load_progress_step
  327.         if [ "$cardname" = "[Unknown]" ]; then
  328.             load_module "$module"
  329.         else
  330.             load_module "$module" "$cardname"
  331.         fi
  332.     fi
  333.  
  334.     db_progress STEP $MODULE_STEPSIZE
  335.     IFS="$NEWLINE"
  336. done
  337. IFS="$IFS_SAVE"
  338.  
  339. if [ -z "$LIST" ]; then
  340.     db_progress STEP $MODULE_STEPS
  341. fi
  342.  
  343. # Load ide-generic and check if that results in new block devices.
  344. # If so, make sure it is added to the initrd for the installed system.
  345. # Note: this may need to be done for more systems than just systems
  346. # that have an ISA bus, but that seems like a good start; it could also
  347. # be done unconditionally.
  348. if [ -z "$LOAD_IDE" ] && is_not_loaded ide-generic && \
  349.    [ -e /sys/bus/isa ] && is_available ide-generic; then
  350.     update-dev --settle
  351.     blockdev_count=$(ls /sys/block | wc -w)
  352.  
  353.     log "ISA bus detected; loading module 'ide-generic'"
  354.     load_module ide-generic
  355.     update-dev --settle
  356.     if [ $(ls /sys/block | wc -w) -gt $blockdev_count ]; then
  357.         log "New devices detected after loading ide-generic"
  358.  
  359.         # This will tell initramfs-tools to load ide-generic
  360.         kopts=
  361.         if db_get debian-installer/add-kernel-opts && [ "$RET" ]; then
  362.             kopts="$RET"
  363.         fi
  364.         if ! echo "$kopt" | grep -Eq "(^| )all_generic_ide( |$)"; then
  365.             db_set debian-installer/add-kernel-opts \
  366.                 "${kopts:+$kopts }all_generic_ide"
  367.         fi
  368.     fi
  369. fi
  370.  
  371. if ! is_not_loaded ohci1394 || ! is_not_loaded firewire-ohci; then
  372.     # if firewire was found, try to enable firewire cd support
  373.     if is_not_loaded sbp2 && is_not_loaded firewire-sbp2 && \
  374.         is_available scsi_mod; then
  375.             sbp2module=
  376.         if is_available firewire-sbp2; then
  377.             sbp2module=firewire-sbp2
  378.         elif is_available sbp2; then
  379.             sbp2module=sbp2
  380.         fi
  381.         if [ -n "$sbp2module" ]; then
  382.             db_subst hw-detect/load_progress_step CARDNAME "FireWire CDROM support"
  383.             db_subst hw-detect/load_progress_step MODULE "$sbp2module"
  384.             db_progress INFO hw-detect/load_progress_step
  385.             load_module "$sbp2module"
  386.             register-module "$sbp2module"
  387.         else
  388.             missing_module firewire-sbp2 "FireWire CDROM"
  389.         fi
  390.     fi
  391.     db_progress STEP $OTHER_STEPSIZE
  392. fi
  393.  
  394. # Always load the printer driver on i386 and amd64; it's hard to autodetect.
  395. case $SUBARCH in
  396.     i386/*|amd64/*)
  397.         register-module lp
  398.         ;;
  399. esac
  400.  
  401. apply_pcmcia_resource_opts() {
  402.     local config_opts=/etc/pcmcia/config.opts
  403.     
  404.     # Idempotency
  405.     if ! [ -f ${config_opts}.orig ]; then
  406.         cp $config_opts ${config_opts}.orig
  407.     fi
  408.     cp ${config_opts}.orig $config_opts
  409.  
  410.     local mode=""
  411.     local rmode=""
  412.     local type=""
  413.     local value=""
  414.     while [ -n "$1" ] && [ -n "$2" ] && [ -n "$3" ]; do
  415.         if [ "$1" = exclude ]; then
  416.             mode=exclude
  417.             rmode=include
  418.             shift
  419.         elif [ "$1" = include ]; then
  420.             mode=include
  421.             rmode=exclude
  422.             shift
  423.         fi
  424.         type="$1"
  425.         shift
  426.         value="$1"
  427.         shift
  428.         
  429.         if grep -q "^$rmode $type $value\$" $config_opts; then
  430.             sed "s/^$rmode $type $value\$/$mode $type $value/" \
  431.                 $config_opts >${config_opts}.new
  432.             mv ${config_opts}.new $config_opts
  433.         else
  434.             echo "$mode $type $value" >>$config_opts
  435.         fi
  436.     done
  437. }
  438.  
  439. # get pcmcia running if possible
  440. PCMCIA_INIT=
  441. if [ -x /etc/init.d/pcmciautils ]; then
  442.     PCMCIA_INIT=/etc/init.d/pcmciautils
  443. fi
  444. if [ "$PCMCIA_INIT" ]; then
  445.     if is_not_loaded pcmcia_core; then
  446.         db_input medium hw-detect/start_pcmcia || true
  447.  
  448.         # GTK frontend: include question about resources in dialog
  449.         if [ "$DEBIAN_FRONTEND" = "gtk" ]; then
  450.             db_input low hw-detect/pcmcia_resources || true
  451.         fi
  452.         db_go || true
  453.  
  454.         # Other frontends: only ask about resources if PCMCIA was selected
  455.         if [ "$DEBIAN_FRONTEND" != "gtk" ]; then
  456.             db_get hw-detect/start_pcmcia || true
  457.             if [ "$RET" = true ]; then
  458.                 db_input low hw-detect/pcmcia_resources || true
  459.                 db_go || true
  460.             fi
  461.         fi
  462.         if db_get hw-detect/pcmcia_resources && [ "$RET" ]; then
  463.             apply_pcmcia_resource_opts $RET
  464.         fi
  465.     fi
  466.     if db_get hw-detect/start_pcmcia && [ "$RET" = true ]; then
  467.         db_progress INFO hw-detect/pcmcia_step
  468.         $PCMCIA_INIT start 2>&1 | log
  469.         db_progress STEP $OTHER_STEPSIZE
  470.     fi
  471. fi
  472.  
  473. have_pcmcia=0
  474. if ls /sys/class/pcmcia_socket/* >/dev/null 2>&1; then
  475.     if db_get hw-detect/start_pcmcia && [ "$RET" = false ]; then
  476.         have_pcmcia=0
  477.     else
  478.         have_pcmcia=1
  479.     fi
  480. fi
  481.  
  482. # find Cardbus network cards
  483. cardbus_check_netdev()
  484. {
  485.     local socket="$1"
  486.     local netdev="$2"
  487.     if [ -L $netdev/device ] && \
  488.         [ -d $socket/device/$(basename $(readlink $netdev/device)) ]; then
  489.         echo $(basename $netdev) >> /etc/network/devhotplug
  490.     fi
  491. }
  492. if ls /sys/class/pcmcia_socket/* >/dev/null 2>&1; then
  493.     for socket in /sys/class/pcmcia_socket/*; do
  494.         for netdev in /sys/class/net/*; do
  495.             cardbus_check_netdev $socket $netdev
  496.         done
  497.     done
  498. fi
  499.  
  500. # Try to do this only once..
  501. if [ "$have_pcmcia" -eq 1 ] && \
  502.    ! grep -q pcmciautils /var/lib/apt-install/queue 2>/dev/null; then
  503.     log "Detected PCMCIA, installing pcmciautils."
  504.     apt-install pcmciautils || true
  505.  
  506.     if db_get hw-detect/pcmcia_resources && [ -n "$RET" ]; then
  507.         echo "mkdir /target/etc/pcmcia 2>/dev/null || true" \
  508.             >>$finish_install
  509.         echo "cp /etc/pcmcia/config.opts /target/etc/pcmcia/config.opts" \
  510.             >>$finish_install
  511.     fi
  512. fi
  513.  
  514. # Install udev into target
  515. apt-install udev || true
  516.  
  517. # Install usbutils
  518. if [ -d /sys/bus/usb ]; then
  519.     apt-install usbutils || true
  520. fi
  521.  
  522. # If hardware has support for pmu, install pbbuttonsd
  523. if [ -d /sys/class/misc/pmu/ ]; then
  524.     apt-install pbbuttonsd || true
  525. fi
  526.  
  527. # Install eject?
  528. if [ -n "$(list-devices cd; list-devices maybe-usb-floppy)" ]; then
  529.     apt-install eject || true
  530. fi
  531.  
  532. # Install optimised libc based on CPU type
  533. case "$(udpkg --print-architecture)" in
  534.     armel)
  535.     if grep -q '^Features.* vfp\>' /proc/cpuinfo; then
  536.         apt-install libc6-vfp || true
  537.     fi
  538.     ;;
  539.     i386)
  540.     case "$(grep '^cpu family' /proc/cpuinfo | head -n1 | cut -d: -f2)" in
  541.         " 6"|" 15")
  542.         # intel 686 or Amd k6.
  543.         apt-install libc6-i686 || true
  544.                 ;;
  545.     esac
  546.     ;;
  547.     sparc)
  548.     if grep -q '^type.*: sun4u' /proc/cpuinfo ; then
  549.         # sparc v9 or v9b
  550.         if grep -q '^cpu.*: .*UltraSparc III' /proc/cpuinfo; then
  551.             apt-install libc6-sparcv9b || true
  552.         else
  553.             apt-install libc6-sparcv9 || true
  554.         fi
  555.     fi
  556.     ;;
  557. esac
  558.  
  559. # Install PS3 utilities
  560. case $SUBARCH in
  561.     powerpc/ps3)
  562.         apt-install ps3pf-utils || true
  563.         ;;
  564. esac
  565.  
  566. # Install Cell utilities
  567. case $SUBARCH in
  568.     powerpc/ps3|powerpc/cell)
  569.         apt-install elfspe2 || true
  570.         ;;
  571. esac
  572.  
  573. # Some hardware may need extra time to initialize:
  574.  
  575. # megaraid_mbox hardware RAID
  576. if lsmod | grep -q megaraid_mbox; then
  577.     db_progress INFO hw-detect/hardware_init_step
  578.     wait_megaraid_complete
  579.  
  580.     # Add rootdelay boot option for target system
  581.     if [ -z "$LOAD_IDE" ]; then
  582.         kopts=
  583.         if db_get debian-installer/add-kernel-opts && [ "$RET" ]; then
  584.             kopts="$RET"
  585.             # remove any existing rootdelay= option
  586.             kopts="$(echo "$kopts" | sed -r "s/(^| )rootdelay=[^ ]*//")"
  587.         fi
  588.         db_set debian-installer/add-kernel-opts \
  589.             "${kopts:+$kopts }rootdelay=10"
  590.     fi
  591. fi
  592. db_progress STEP $OTHER_STEPSIZE
  593.  
  594.  
  595. db_progress SET $MAX_STEPS
  596. db_progress STOP
  597.  
  598. if [ -n "$MISSING_MODULES_LIST" ]; then
  599.     log "Missing modules '$MISSING_MODULES_LIST"
  600. fi
  601.  
  602. check-missing-firmware
  603.  
  604. sysfs-update-devnames
  605.  
  606. # Let userspace /dev tools rescan the devices
  607. update-dev --settle
  608.  
  609. exit 0
  610.